From: kaf24@firebug.cl.cam.ac.uk Date: Fri, 19 May 2006 16:50:32 +0000 (+0100) Subject: [SHADOW] Crash the guest rather than BUGing the whole system when out of memory. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~16047^2~18 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=25dd77a19b026faa7972667094b11d6a8251acd6;p=xen.git [SHADOW] Crash the guest rather than BUGing the whole system when out of memory. Signed-off-by: Yunhong Jiang --- diff --git a/xen/arch/x86/shadow.c b/xen/arch/x86/shadow.c index 729e5474e9..58690617c5 100644 --- a/xen/arch/x86/shadow.c +++ b/xen/arch/x86/shadow.c @@ -430,7 +430,8 @@ no_shadow_page: perfc_value(shadow_l2_pages), perfc_value(hl2_table_pages), perfc_value(snapshot_pages)); - BUG(); /* XXX FIXME: try a shadow flush to free up some memory. */ + /* XXX FIXME: try a shadow flush to free up some memory. */ + domain_crash_synchronous(); return 0; } @@ -3064,7 +3065,8 @@ static inline unsigned long init_bl2( if ( unlikely(!(smfn = alloc_shadow_page(d, gpfn, gmfn, PGT_l4_shadow))) ) { printk("Couldn't alloc an L4 shadow for pfn=%lx mfn=%lx\n", gpfn, gmfn); - BUG(); /* XXX Deal gracefully with failure. */ + /* XXX Deal gracefully with failure. */ + domain_crash_synchronous(); } spl4e = (l4_pgentry_t *)map_domain_page(smfn); diff --git a/xen/arch/x86/shadow32.c b/xen/arch/x86/shadow32.c index c8ff4f579c..bef350aa23 100644 --- a/xen/arch/x86/shadow32.c +++ b/xen/arch/x86/shadow32.c @@ -246,7 +246,8 @@ alloc_shadow_page(struct domain *d, perfc_value(shadow_l2_pages), perfc_value(hl2_table_pages), perfc_value(snapshot_pages)); - BUG(); /* XXX FIXME: try a shadow flush to free up some memory. */ + /* XXX FIXME: try a shadow flush to free up some memory. */ + domain_crash_synchronous(); } smfn = page_to_mfn(page); @@ -983,6 +984,11 @@ alloc_p2m_table(struct domain *d) else { page = alloc_domheap_page(NULL); + if (!page) + { + printk("Alloc p2m table fail\n"); + domain_crash(d); + } l1tab = map_domain_page(page_to_mfn(page)); memset(l1tab, 0, PAGE_SIZE); diff --git a/xen/arch/x86/shadow_public.c b/xen/arch/x86/shadow_public.c index 23c489ac47..3f100e4935 100644 --- a/xen/arch/x86/shadow_public.c +++ b/xen/arch/x86/shadow_public.c @@ -324,6 +324,11 @@ static void alloc_monitor_pagetable(struct vcpu *v) mmfn_info = alloc_domheap_page(NULL); ASSERT( mmfn_info ); + if (!mmfn_info) + { + printk("Fail to allocate monitor pagetable\n"); + domain_crash(v->domain); + } mmfn = page_to_mfn(mmfn_info); mpl4e = (l4_pgentry_t *) map_domain_page_global(mmfn);